扩展技能 | 《Python数据分析从小白到专家》
前言:文末正版好书赠送《Python数据分析从小白到专家》活动5本,值得拥有,等你参与哦!
编辑:洋洋
匿名函数lambda
匿名函数lambda属于函数式编程的范畴,但是Python不是天生的函数式编程语言。即便如此,虽然Python不适合函数式编程,但是匿名函数lambda迅速命名函数的方式可以使代码更加简洁。首先,来看看如何定义一个一般函数和匿名函数lambda,代码如下:
# 一般函数的定义
def tellMeYourName():
return 'Tim'
print(tellMeYourName())
# 匿名函数lambda的定义
tellMeYourNameV2 = lambda: 'TIM'
print(tellMeYourNameV2())
输出结果:
Tim
TIM
Process finished with exit code 0
可见,对于这种只有一行的函数非常适合用匿名函数lambda来编写,因为使用lambda的代码只占一行,十分简明。调用方式也和普通的用def和return语句定义的函数一样。
匿名函数不会在任何空间里创建名字,所以可以节省大量内存,如下是匿名函数lambda的使用示例:
a=lambda x,y=2:x+y
调用方式如下:
a(3)# 3+2
a(3,5)# 3+5
输出结果:
5
8
Process finished with exit code 0
Python函数式编程还拥有3个内建函数,即filter()、map()、reduce(),分别用于过滤、映射、迭代。先来看filter()过滤器的源代码:
def filter(bool_func,seq):
filtered_seq=[]
for eachItem in seq:
if bool_func(eachItem):
filtered_seq.append(eachItem)
return filtered_seq
原理是当if bool_func(eachItem)被判为True时,把eachItem加入新的filtered_seq列表中,否则舍去。bool_func是过滤法则;seq是传入列表;filtered_seq是传出列表。下面的示例是先产生一个较大的随机数集合,然后过滤所有的偶数,留下奇数,代码如下:
from random import randint
def odd(n):
return n%2
allNums=[]
for eachNum in range(9):
allNums.append(randint(1,99))
print(filter(odd,allNums))
输出结果:
<filter object at 0x03758070>
Process finished with exit code 0
上述代码打印的是所在的地址,其作用实际上和下面这段代码的作用一样。
from random import randint as ri
print(n for n in [ri(1,99)for i in range(9)]if n%2)
输出结果:
<generator object <genexpr> at 0x0398B8B0>
Process finished with exit code 0
map()是映射函数,大致的源代码如下:
def map(func,seq):
mapped_seq=[]
for eachItem in seq:
mapped_seq.append(eachItem)
return mapped_seq
其中,func是映射规则;seq是传入的原列表;mapped_seq是返回后的映射内容,可用于哈希表(字典)的创建过程中。
reduce()是迭代器,也被称为“折叠”,示例代码如下:
reduce(func,[1,2,3])
func(func(1,2),3)
具体的示例代码如下所示:
print('the total is:',reduce((lambda x,y:x+y),range(5))
输出结果:
the total is 10
Process finished with exit code 0
Python自定义类与打印函数
首先介绍面向对象编程(OOP),其是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次进行系统建模,更贴近事物的自然运行模式。
确切地说,面向对象编程是通过“抽象”“继承”“封装”这3种方式来实现更佳的“人机友好”。抽象是将一些方法写为抽象类,一种不可以被实例化,只能被继承的类;通过“继承”衍生出各种子类,将方法“封装”在各个子类中以供使用者调用。这就是面向对象编程(OOP)的基本思想。
在Python中以class为关键字,在其后跟类名来创建一个自定义的类,在内部封装类对象和方法等,示例如下:
class Logger(object):
# 对象、方法等
定义方法和定义函数一样,都使用def语句,示例如下:
Import sys
class Logger(object):
def __init__(self, fileN="Default.log"):
self.terminal = sys.stdout
self.log = open(fileN, "a", encoding="utf-8")
def write(self, message):
self.terminal.write(message)
self.log.write(message)
def flush(self):
pass
Logger类的作用是传入一个文件名(也可以不传,默认生成),如果该文件存在,则将屏幕打印的内容保存到一个TXT文件里,示例如下:
import sys
class Logger(object):
def __init__(self, fileN="Default.log"):
self.terminal = sys.stdout
self.log = open(fileN, "a", encoding="utf-8")
def write(self, message):
self.terminal.write(message)
self.log.write(message)
def flush(self):
pass
sys.stdout = Logger("E:\\example1.txt")
for i in range(0, 30):
print(i)
输出结果:
0
1
2
3
4
…
25
26
27
28
29
Process finished with exit code 0
读者可以在E盘中找到一个名为example1.txt的文件,其中存放了打印出的内容,如图1所示。
图1 用于保存输出结果的自定义类文件输出示例
-本文章摘自《 Python数据分析从小白到专家》一书,有删改,以出版纸质书为准。
推荐语:
赠书环节
送书环节来了,
公众号回复“066”,参与抽奖。
一共5本正版图书!
也欢迎把本次抽奖活动分享给更多的朋友
扫一扫回复:“066”
温馨提示:本次送书活动为关注本公众号的粉丝专属福利
开奖后三天内和我们联系哦
不联系视为作废
我们以快递的方式给粉丝们包邮到家